{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "b30dcfed-e934-4858-9407-6c72cd0aab12",
   "metadata": {},
   "source": [
    "Chapter 27\n",
    "# 一元OLS线性回归\n",
    "Book_1《编程不难》 | 鸢尾花书：从加减乘除到机器学习  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "7e9b739a-3c43-45e4-bd7c-aecacbc2aa3e",
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import statsmodels.api as sm\n",
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "2ee2eddb-b865-42f6-94a6-e8923bad3a71",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 生成随机数据\n",
    "num = 50\n",
    "np.random.seed(0)\n",
    "x_data = np.random.uniform(0,10,num)\n",
    "y_data = 0.5 * x_data + 1 + np.random.normal(0, 1, num)\n",
    "data = np.column_stack([x_data,y_data])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "299ff0a5-0922-4507-ab55-7f96c3d968cb",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 添加常数列\n",
    "X = sm.add_constant(x_data)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "20719134-8e19-45f9-9238-3b0294257519",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 创建一元OLS线性回归模型\n",
    "model = sm.OLS(y_data, X)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "03a497fe-8b76-4a32-8ffd-7d44aa090da1",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 拟合模型\n",
    "results = model.fit()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "b86bed4d-bb74-4c3e-a940-bceca3fe6086",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "                            OLS Regression Results                            \n",
      "==============================================================================\n",
      "Dep. Variable:                      y   R-squared:                       0.656\n",
      "Model:                            OLS   Adj. R-squared:                  0.649\n",
      "Method:                 Least Squares   F-statistic:                     91.59\n",
      "Date:                Tue, 03 Oct 2023   Prob (F-statistic):           1.05e-12\n",
      "Time:                        14:31:11   Log-Likelihood:                -67.046\n",
      "No. Observations:                  50   AIC:                             138.1\n",
      "Df Residuals:                      48   BIC:                             141.9\n",
      "Df Model:                           1                                         \n",
      "Covariance Type:            nonrobust                                         \n",
      "==============================================================================\n",
      "                 coef    std err          t      P>|t|      [0.025      0.975]\n",
      "------------------------------------------------------------------------------\n",
      "const          0.9928      0.296      3.358      0.002       0.398       1.587\n",
      "x1             0.4693      0.049      9.570      0.000       0.371       0.568\n",
      "==============================================================================\n",
      "Omnibus:                        1.199   Durbin-Watson:                   2.274\n",
      "Prob(Omnibus):                  0.549   Jarque-Bera (JB):                1.213\n",
      "Skew:                           0.283   Prob(JB):                        0.545\n",
      "Kurtosis:                       2.487   Cond. No.                         13.6\n",
      "==============================================================================\n",
      "\n",
      "Notes:\n",
      "[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.\n"
     ]
    }
   ],
   "source": [
    "# 打印回归结果\n",
    "print(results.summary())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "9de8e058-9f7c-4b18-bb0b-76225acf77d2",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 预测\n",
    "x_array = np.linspace(0,10,101)\n",
    "predicted = results.params[1] * x_array + results.params[0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "566b8e43-cd93-4ccd-b7e6-a3e54bd08b42",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(-2.0, 8.0)"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAcAAAAG2CAYAAADoXlavAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/MnkTPAAAACXBIWXMAAA9hAAAPYQGoP6dpAABUwElEQVR4nO3de1jUZd7H8fcwI+ABBlI5KKBgdlAzzVMqecpcy9ztsFZallnt1pppPR23NreTdnCr51k3yw66ZXZa18otSS3R7KBmdlDL1kABBfEAA6IMzszv+WOcEQQUFZgZfp/Xdc116Y9huMGaD/f9u7/f22IYhoGIiIjJhAV6ACIiIoGgABQREVNSAIqIiCkpAEVExJQUgCIiYkoKQBERMSUFoIiImJICUERETEkBKCIipqQAFBERUwqZAHS5XDz00EOkpqbSvHlz0tLSePTRR/F4PIEemoiIhCBboAdQV0899RQvvvgi//znP+natSvffPMNN954I3a7nSlTpgR6eCIiEmJCJgC/+uorfve73zFq1CgAOnbsyFtvvcU333wT4JGJiEgoCpkATE9P58UXX+SXX37hjDPO4Pvvv2f16tU8//zztX6O0+nE6XT6/+7xeNi3bx+tW7fGYrE0wqhFRKS+GIZBaWkp7dq1IyysHu7gGSHC4/EY999/v2GxWAybzWZYLBZj+vTpx/ycadOmGYAeeuihhx5N6JGbm1svuWIxjNA4D/Dtt9/mnnvu4ZlnnqFr16589913TJ06lWeffZYbbrihxs85egbocDhISUkhNzeX6Ojoxhq6iIjUg5KSEpKTkykuLsZut5/y64VMACYnJ3P//fczadIk/7XHH3+c+fPn8/PPP9fpNUpKSrDb7TgcDgWgiEiIqe/38JApgzhw4EC1NV+r1aoyCBEROSkhswlm9OjRPPHEE6SkpNC1a1c2bNjAs88+y8SJEwM9NBERCUEhswRaWlrKX/7yFxYtWkRhYSHt2rVj7NixPPzww4SHh9fpNbQEKiISuur7PTxkArA+KABFREKXae8BioiI1CcFoIiImJICUERETEkBKCIipqQAFBERU1IAioiIKSkARUTElBSAIiJiSgpAERExJQWgiIiYkgJQRERMSQEoIiKmpAAUERFTUgCKiIgpKQBFRMSUFIAiImJKCkARETElBaCIiJiSAlBERExJASgiIqak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mC8i0rhCZhNMmzZtsFqt1WZ7hYWF1WaFPhEREURERNT4sWCjwnwRkcYVMjPA8PBwevXqxbJly6pcX7ZsGQMGDAjQqOqPCvNFRBpXyAQgwF133cUrr7zCa6+9xk8//cSdd95JTk4Ot956a6CHdspUmC8i0rhCZgkU4Oqrr2bv3r08+uij5Ofn061bNz7++GM6dOgQ6KHVC19h/iOLN1fZEJNgj1QdoIhIPQupOsBTFex1gD5ujxE0hfkiIsGivt/DQ2oGaBbWMAv9O7UO9DBERJq0kLoHKCIiUl8UgCIiYkoKQBERMSUFoIiImJICUERETEkBKCIipqQAFBERU1IAioiIKSkARUTElBSAIiJiSgpAERExJQWgiIiYkgJQRERMSQEoIiKmpAAUERFTUgCKiIgpKQBFRMSUFIAiImJKCkARETElBaCIiJiSAlBERExJASgiIqakABQREVNSAIqIiCkpAEVExJQUgCIiYkoKQBERMSUFoIiImJICUERETEkBKCIipqQAFBERU1IAioiIKSkARUTElBSAIiJiSgpAERExJQWgiIiYkgJQRERMSQEoIiKmpAAUERFTUgCKiIgpKQBFRMSUFIAiImJKCkARETElBaCIiJiSAlBERExJASgiIqakABQREVNSAIqIiCkpAEVExJQUgCIiYkoKQBERMSUFoIiImJICUERETEkBKCIipqQAFBERU1IAioiIKSkARUTElBSAIiJiSgpAERExJQWgiIiYkgJQRERMSQEoIiKmFBIBuG3bNm666SZSU1Np3rw5nTp1Ytq0aVRUVAR6aCIiEqJsgR5AXfz88894PB5eeuklTj/9dDZu3Mgtt9xCWVkZM2fODPTwREQkBFkMwzACPYiT8cwzzzB79myysrLq/DklJSXY7XYcDgfR0dENODoREalv9f0eHhIzwJo4HA5OO+20Yz7H6XTidDqrfA54f4giIhJafO/d9TZvM0LQ1q1bjejoaOPll18+5vOmTZtmAHrooYceejShx6+//lovWRLQJdC//vWvPPLII8d8zrp16+jdu7f/7zt37mTw4MEMHjyYV1555Zife/QMsLi4mA4dOpCTk4Pdbj+1wTdhJSUlJCcnk5ubq6XiY9DPqW70czo+/YzqxuFwkJKSQlFRETExMaf8egFdAr399tu55pprjvmcjh07+v+8c+dOhg4dSv/+/ZkzZ85xXz8iIoKIiIhq1+12u/4jq4Po6Gj9nOpAP6e60c/p+PQzqpuwsPopYAhoALZp04Y2bdrU6bk7duxg6NCh9OrVi7lz59bbD0BERMwpJDbB7Ny5kyFDhpCSksLMmTPZvXu3/2MJCQkBHJmIiISqkAjApUuXsnXrVrZu3UpSUlKVj53ILcyIiAimTZtW47KoHKGfU93o51Q3+jkdn35GdVPfP6eQrQMUERE5FbqRJiIipqQAFBERU1IAioiIKSkARUTElEwTgC+88AKpqalERkbSq1cvPv/880APKajMmDGDPn36EBUVRVxcHJdddhlbtmwJ9LCC3owZM7BYLEydOjXQQwk6O3bs4LrrrqN169a0aNGCHj16sH79+kAPK6i4XC4eeugh/1FvaWlpPProo3g8nkAPLaBWrVrF6NGjadeuHRaLhffff7/Kxw3D4K9//Svt2rWjefPmDBkyhE2bNp3w1zFFAL7zzjtMnTqVBx98kA0bNnDBBRdw8cUXk5OTE+ihBY2VK1cyadIkvv76a5YtW4bL5WLEiBGUlZUFemhBa926dcyZM4fu3bsHeihBp6ioiIEDB9KsWTOWLFnC5s2b+dvf/lYv7auakqeeeooXX3yRWbNm8dNPP/H000/zzDPP8Pe//z3QQwuosrIyzj33XGbNmlXjx59++mmeffZZZs2axbp160hISOCiiy6itLT0xL5QvXQUDXJ9+/Y1br311irXzjrrLOP+++8P0IiCX2FhoQEYK1euDPRQglJpaanRuXNnY9myZcbgwYONKVOmBHpIQeW+++4z0tPTAz2MoDdq1Chj4sSJVa5dccUVxnXXXRegEQUfwFi0aJH/7x6Px0hISDCefPJJ/7Xy8nLDbrcbL7744gm9dpOfAVZUVLB+/XpGjBhR5fqIESP48ssvAzSq4Oc7Oup4R06Z1aRJkxg1ahTDhw8P9FCC0ocffkjv3r0ZM2YMcXFx9OzZk5dffjnQwwo66enpfPrpp/zyyy8AfP/996xevZpLLrkkwCMLXtnZ2RQUFFR5T4+IiGDw4MEn/J4eEp1gTsWePXtwu93Ex8dXuR4fH09BQUGARhXcDMPgrrvuIj09nW7dugV6OEHn7bff5ttvv2XdunWBHkrQysrKYvbs2dx11138+c9/Zu3atdxxxx1ERERw/fXXB3p4QeO+++7D4XBw1llnYbVacbvdPPHEE4wdOzbQQwtavvftmt7Tt2/ffkKv1eQD0MdisVT5u2EY1a6J1+23384PP/zA6tWrAz2UoJObm8uUKVNYunQpkZGRgR5O0PJ4PPTu3Zvp06cD0LNnTzZt2sTs2bMVgJW88847zJ8/nwULFtC1a1e+++47pk6dSrt27bjhhhsCPbygVh/v6U0+ANu0aYPVaq022yssLKz2G4TA5MmT+fDDD1m1alW1vqsC69evp7CwkF69evmvud1uVq1axaxZs3A6nVit1gCOMDgkJibSpUuXKtfOPvtsFi5cGKARBad77rmH+++/338s3DnnnMP27duZMWOGArAWvgMQCgoKSExM9F8/mff0Jn8PMDw8nF69erFs2bIq15ctW8aAAQMCNKrgYxgGt99+O//+97/57LPPSE1NDfSQgtKFF17Ijz/+yHfffed/9O7dm2uvvZbvvvtO4XfYwIEDq5XR/PLLL3To0CFAIwpOBw4cqHa0m9VqNX0ZxLGkpqaSkJBQ5T29oqKClStXnvB7epOfAQLcddddjB8/nt69e/sP083JyeHWW28N9NCCxqRJk1iwYAEffPABUVFR/hmz3W6nefPmAR5d8IiKiqp2X7Rly5a0bt1a90srufPOOxkwYADTp0/nqquuYu3atcyZM6dOB1mbyejRo3niiSdISUmha9eubNiwgWeffZaJEycGemgBtX//frZu3er/e3Z2Nt999x2nnXYaKSkpTJ06lenTp9O5c2c6d+7M9OnTadGiBePGjTuxL1Qf21RDwT/+8Q+jQ4cORnh4uHHeeedpe/9RgBofc+fODfTQgp7KIGq2ePFio1u3bkZERIRx1llnGXPmzAn0kIJOSUmJMWXKFCMlJcWIjIw00tLSjAcffNBwOp2BHlpArVixosb3oxtuuMEwDG8pxLRp04yEhAQjIiLCGDRokPHjjz+e8NfRcUgiImJKTf4eoIiISE0UgCIiYkoKQBERMSUFoIiImJICUERETEkBKCIipqQAFBERU1IAioiIKSkARUTElBSAIiJiSgpAkRC3e/duEhIS/GfvAaxZs4bw8HCWLl0awJGJBDf1AhVpAj7++GMuu+wyvvzyS8466yx69uzJqFGjeP755wM9NJGgpQAUaSImTZrE8uXL6dOnD99//z3r1q3TqfUix6AAFGkiDh48SLdu3cjNzeWbb76he/fugR6SSFDTPUCRJiIrK4udO3fi8XjYvn17oIcjEvQ0AxRpAioqKujbty89evTgrLPO4tlnn+XHH38kPj4+0EMTCVoKQJEm4J577uFf//oX33//Pa1atWLo0KFERUXxn//8J9BDEwlaWgIVCXGZmZk8//zzvPHGG0RHRxMWFsYbb7zB6tWrmT17dqCHJxK0NAMUERFT0gxQRERMSQEoIiKmpAAUERFTUgCKiIgpKQBFRMSUFIAiImJKCkARETElBaCIiJiSAlBERExJASgiIqakABQREVNSAIqIiCn9P0XeMsVpeJPIAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig, ax = plt.subplots()\n",
    "ax.scatter(x_data, y_data)\n",
    "ax.scatter(x_data, results.fittedvalues, \n",
    "           color = 'k', marker = 'x')\n",
    "ax.plot(x_array, predicted, \n",
    "        color = 'r')\n",
    "\n",
    "data_ = np.column_stack([x_data,results.fittedvalues])\n",
    "\n",
    "ax.plot(([i for (i,j) in data_], [i for (i,j) in data]),\n",
    "        ([j for (i,j) in data_], [j for (i,j) in data]),\n",
    "        c=[0.6,0.6,0.6], alpha = 0.5)\n",
    "\n",
    "ax.set_xlabel('x'); ax.set_ylabel('y')\n",
    "ax.set_aspect('equal', adjustable='box')\n",
    "ax.set_xlim(0,10); ax.set_ylim(-2,8)\n",
    "# fig.savefig('一元线性回归.svg', format='svg')"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.9"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
